{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "阅读本文大概需要 3.6 分钟。\n",
    "\n",
    "原文：https://fastapi.tiangolo.com/alternatives/\n",
    "\n",
    "作者：tiangolo，FastAPI 的创作者，github star 10.1k\n",
    "\n",
    "翻译：somenzz\n",
    "\n",
    "侵删\n",
    "\n",
    "本文讲述了什么启发了 FastAPI 的诞生，它与其他替代框架的对比，以及从中汲取的经验。  \n",
    "\n",
    "**简介**\n",
    "\n",
    "-----------\n",
    "\n",
    "如果不是基于前人的成果，FastAPI将不会存在。在 FastAPI之前，前人已经创建了许多工具 。\n",
    "\n",
    "几年来，我一直在避免创建新框架。首先，我尝试使用许多不同的框架，插件和工具来解决 **FastAPI**涵盖的所有功能。\n",
    "\n",
    "但是有时候，没有更好的办法，除了创建具有所有这些功能的东西，从以前的工具中汲取最佳创意，并以最佳方式将它们组合起来，使用以前甚至没有的语言功能（Python 3.6 + 类型提示）。\n",
    "\n",
    "**在此之前的一些框架：**\n",
    "\n",
    "------------------\n",
    "\n",
    "**Django**\n",
    "\n",
    "Django 是最流行的 Python 框架，受到广泛信任。它用于构建 Instagram 之类的系统。\n",
    "\n",
    "它与关系数据库（例如 MySQL 或 PostgreSQL）相对紧密地结合在一起，因此，以 NoSQL 数据库（例如 Couchbase，MongoDB，Cassandra 等）作为 django 的主存储引擎并不是一件容易的事。\n",
    "\n",
    "创建它是为了在后端生成 HTML，而不是创建现代前端（例如 React，Vue.js 和 Angular）或与其通信的其他系统（例如 IoT 设备）使用的 API 。\n",
    "\n",
    "**Django REST Framework**\n",
    "\n",
    "Django REST Framework 是一个非常灵活的框架，用于构建 Web API，以改善 Django 的 API 功能。\n",
    "\n",
    "Mozilla，Red Hat 和 Eventbrite 等许多公司都使用它。\n",
    "\n",
    "Django REST Framework 是第一个自动生成 API 文档的框架，自动生成 API 的接口文档是 FastAPI 框架诞生的缘由之一。\n",
    "\n",
    "**注意**\n",
    "\n",
    "Django REST Framework 框架的作者是 Tom Christie ，Tom Christie 也创造了 Starlette 和 Uvicorn。FastAPI 正是建立在 Starlette 和 Uvicorn 的基础之上。\n",
    "\n",
    "**启发 FastAPI 地方**：有一个自动 API 文档，Web 用户界面可供用户测试。\n",
    "\n",
    "**Flask**\n",
    "\n",
    "Flask 是一种轻量级的框架，它不包括数据库集成，也没有很多的附带的功能，虽然这 Django 那里是默认提供的。\n",
    "\n",
    "这个简单性和灵活的特性允许使用 NoSQL 数据库作为主数据存储。尽管文档在某些方面有所技术性，但它非常简单，因此学习起来相对直观。\n",
    "\n",
    "它还常用于其他不需要数据库，用户管理或 Django 中预建功能的应用程序。尽管其中许多功能都可以通过添加插件来实现。\n",
    "\n",
    "各个模块之前的解耦，使之成为一个 “微框架”，可以通过扩展为精确地提供所需的东西，这是我想要保留的一项关键功能。\n",
    "\n",
    "考虑到 Flask 的简单性，它似乎很适合构建 API。接下来要找到的是 Flask 的 “Django REST Framework”。\n",
    "\n",
    "**启发 FastAPI 地方：**成为一个微框架。易于混合和匹配所需的工具和零件。拥有一个简单易用的路由系统。\n",
    "\n",
    "**Requests**\n",
    "\n",
    "FastAPI 实际上不是 Requests 的替代工具。它们的适用范围非常不同。实际上，在 FastAPI 应用程序内部使用 Requests 是很常见的。\n",
    "\n",
    "但是，FastAPI 从 Requests 中获得了很多启发。Requests  是一个与 API（作为客户端）进行交互的库，而 FastAPI 是一个用于构建 API（作为服务器）的库。它们或多或少地处于相反的末端，彼此互补。Requests   具有非常简单直观的设计，非常易于使用，并具有合理的默认值。但同时，它非常强大且可自定义。\n",
    "\n",
    "这就是为什么，如官方网站所述：\n",
    "\n",
    "> Requests  是有史以来下载次数最多的 Python 软件包之一\n",
    "\n",
    "您的使用方式非常简单。例如，要发出 GET 请求，您可以编写：\n",
    "\n",
    ">response = requests.get(\"http://example.com/some/url\")\n",
    "\n",
    "FastAPI 对应的 API 路径操作如下所示：\n",
    "\n",
    "```py\n",
    "@app.get(\"/some/url\")\n",
    "def read_url():\n",
    "    return {\"message\": \"Hello World\"}\n",
    "```\n",
    "\n",
    "它们使用起来的相似之处如 `requests.get(...)` 和 `@app.get(...)`。\n",
    "\n",
    "**启发 FastAPI 地方:**\n",
    "\n",
    "*   拥有简单直观的 API。\n",
    "    \n",
    "*   直接，直观地使用 HTTP 方法名称（操作）。\n",
    "    \n",
    "*   具有合理的默认值，功能强大的自定义。\n",
    "    \n",
    "**Swagger****/****OpenAPI**\n",
    "\n",
    "  \n",
    "\n",
    "我想要 Django REST Framework 的主要功能是自动 API 文档。然后我发现 API 文档有一个标准叫 Swagger ，它使用 JSON 或 YAML 来描述。\n",
    "\n",
    "并且 Swagger API 的 Web 用户界面已经被人创建出来了。因此，能够为 API 生成 Swagger 文档将允许自动使用此 Web 用户界面。\n",
    "\n",
    "在某个时候，Swagger 被授予 Linux Foundation，将其重命名为 OpenAPI。这就是为什么在谈论版本 2.0 时通常会说 “Swagger”，对于版本 3 + 来说是 “ OpenAPI”。\n",
    "\n",
    "**启发 FastAPI 地方:**\n",
    "\n",
    "为 API 规范采用开放标准，而不是使用自定义架构。并集成基于标准的用户界面工具：\n",
    "\n",
    "*   Swagger UI\n",
    "    \n",
    "*   ReDoc\n",
    "    \n",
    "\n",
    "选择这两个是因为它们相当受欢迎且稳定，但是通过快速搜索，您可以找到数十个 OpenAPI 的其他替代用户界面（可以与 FastAPI 一起使用）。\n",
    "\n",
    "**Flask REST frameworks**\n",
    "\n",
    "有几个 Flask REST frameworks ，但经过调查和试用，我发现，不少项目都停产或放弃，还存在有一些长期的问题，使得它们并不适合解决前面的问题。\n",
    "\n",
    "**Marshmallow**\n",
    "\n",
    "一个由 API 系统所需的主要功能是数据的序列化，就是把数据从编程语言中的对象转称成可以在网络上传输的对象，比如数据库中的数据转换为 JSON 对象。将 Python 中的 datetime 对象转为字符串，等等。\n",
    "\n",
    "另外一个功能就是数据的验证，确保传入的参数是有效的，例如，有些字段是一个 int，类型而不是字符串，这在检测输入数据是非常有用的。\n",
    "\n",
    "如果没有数据验证，你就必须用手工写代码来完成所有的检查。\n",
    "\n",
    "这两点功能就是 Marshmallow 所提供的，这些是一个伟大的库，之前我经常使用它。\n",
    "\n",
    "Marshmallow 产生之前 Python 还没有加入类型提示。因此，定义一个 schema 你需要引入 Marshmallow 特定的 utils 的和类。\n",
    "\n",
    "**启发 FastAPI 地方:**\n",
    "\n",
    "使用代码来定义提供的数据类型和验证的 schema，验证都是自动化的。\n",
    "\n",
    "**Webargs**\n",
    "\n",
    "API 框架需要的另一大功能点是解析从前端发送的请求数据。Webargs (包括 Flask) 是提供这一功能的工具，它采用 Marshmallow 做数据验证。Webargs 和 Marshmallow  的作者是同一个开发人员。这是一个伟大的工具，在 FastAPI 诞生之前，我一直在用它。\n",
    "\n",
    "**启发 FastAPI 地方:**\n",
    "\n",
    "对输入的请求数据的自动验证。\n",
    "\n",
    "（未完待续）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
